/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufrn.dimap.testes;

import br.ufrn.dimap.Grafo.GrafoLista;
import br.ufrn.dimap.Grafo.Rede;
import br.ufrn.dimap.Grafo.Relacao;
import br.ufrn.dimap.Grafo.Usuario;
import br.ufrn.dimap.Grafo.excecoes.ParDeUsuariosNaoExisteException;
import br.ufrn.dimap.Grafo.excecoes.RedeCheiaException;
import br.ufrn.dimap.Grafo.excecoes.UsuarioJaExistenteException;
import br.ufrn.dimap.Visitors.PrinterVisitor;
import br.ufrn.dimap.Visitors.Visitor;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.*;
import static org.junit.Assert.*;

/**
 *
 * @author augusto
 */
public class GrafoListaTest {
    private Rede grafo;
    public GrafoListaTest() {
    
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }
    
    @Before
    public void setUp() {
            
    }
    
    public void criarGrafoDesconexo(){
        try {
            grafo = new GrafoLista();
            Usuario a = new Usuario("1", "a");
            Usuario b = new Usuario("2", "b");
            Usuario c = new Usuario("3", "c");
            Usuario d = new Usuario("4", "d");
            Usuario e = new Usuario("5", "e");
            Usuario f = new Usuario("6", "f");
            grafo.inserirUsuario(a);
            grafo.inserirUsuario(b);
            grafo.inserirUsuario(c);
            grafo.inserirUsuario(d);
            grafo.inserirUsuario(e);
            grafo.inserirUsuario(f);
            grafo.inserirRelacao(new Relacao(a, b));
            grafo.inserirRelacao(new Relacao(e, f));
            grafo.inserirRelacao(new Relacao(b, c));
            grafo.inserirRelacao(new Relacao(d, e));
            grafo.inserirRelacao(new Relacao(d, f));
            grafo.setRaiz(a);
        } catch (ParDeUsuariosNaoExisteException ex) {
            Logger.getLogger(GrafoListaTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UsuarioJaExistenteException ex) {
            Logger.getLogger(GrafoListaTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RedeCheiaException ex) {
            Logger.getLogger(GrafoListaTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void criarGrafoConexo(){
       try {
            grafo = new GrafoLista();
            Usuario a = new Usuario("1", "a");
            Usuario b = new Usuario("2", "b");
            Usuario c = new Usuario("3", "c");
            Usuario d = new Usuario("4", "d");
            Usuario e = new Usuario("5", "e");
            Usuario f = new Usuario("6", "f");
            grafo.inserirUsuario(a);
            grafo.inserirUsuario(b);
            grafo.inserirUsuario(c);
            grafo.inserirUsuario(d);
            grafo.inserirUsuario(e);
            grafo.inserirUsuario(f);
            grafo.inserirRelacao(new Relacao(a, b));
            grafo.inserirRelacao(new Relacao(b, c));
            grafo.inserirRelacao(new Relacao(c, d));
            grafo.inserirRelacao(new Relacao(b, e));
            grafo.inserirRelacao(new Relacao(d, f));
            grafo.setRaiz(a);
        } catch (ParDeUsuariosNaoExisteException ex) {
            Logger.getLogger(GrafoListaTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UsuarioJaExistenteException ex) {
            Logger.getLogger(GrafoListaTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RedeCheiaException ex) {
            Logger.getLogger(GrafoListaTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    @After
    public void tearDown() {
   
    }

    @Test
    public void testBuscaEmLargura_GrafoConexo() {
        criarGrafoConexo();
        List<Usuario> u = grafo.buscaEmLargura(0, new PrinterVisitor());
        assertEquals("1", u.get(0).getId());
        assertEquals("2", u.get(1).getId());
        assertEquals("3", u.get(2).getId());
        assertEquals("5", u.get(3).getId());
        assertEquals("4", u.get(4).getId());
        System.out.println("Saida: "+u.get(0));
    }
    
    @Test
    public void testBuscaEmLargura_GrafoDesonexo() {
        try{
        criarGrafoDesconexo();
        List<Usuario> u = grafo.buscaEmLargura(0,  new PrinterVisitor());
        assertEquals("1", u.get(0).getId());
        assertEquals("2", u.get(1).getId());
        assertEquals("3", u.get(2).getId());
        }catch(Exception e ){
            fail();
        }
    }
    
    @Test
    public void testBuscaEmLargura_GrafoVazio() {
        try{
            criarGrafoVazio();
            List<Usuario> u = grafo.buscaEmLargura(0,  new PrinterVisitor());
            assertEquals(0, u.size());
        }catch(Exception e){
            fail();
        }
    }    

    @Test
    public void testBuscaEmLargura_raizNegativa() {
        try{
            criarGrafoConexo();
            List<Usuario> u = grafo.buscaEmLargura(-1,  new PrinterVisitor() );
            assertEquals(0, u.size());
        }catch(Exception e){
            fail();
        }
    }    
    
    @Test
    public void testBuscaEmLargura_raizInvalida() {
        try{
            criarGrafoConexo();
            List<Usuario> u = grafo.buscaEmLargura(2000, new PrinterVisitor());
            assertEquals(0, u.size());
        }catch(Exception e){
            fail();
        }
    }    
        
    private void criarGrafoVazio(){
        grafo = new GrafoLista();
    }
}
